package FAnSheJiZhi;

import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author 李某
 * * @date 2021/10/22
 * *物有本末，事有终始。知其先后者，则近道矣！
 * *荷花开满池塘的前一天还是半塘荷花半塘云。
 */
public class FanSheYongFA {
}


// 首先准备两个业务类，这两个业务类很简单
// 就是各自都有一个业务方法，分别打印不同的字符串

class Service1 {
    public void doServer1() {
        System.out.println("业务方法1");
    }
}

class Service2 {
    public void doServer2() {
        System.out.println("业务方法2");
    }
}

// 当需要从第一个业务方法切换到第二个业务方法的时候，
// 使用非反射方式，必须修改代码，并且重新编译运行，才可以达到效果

class Test2 {
    public Test2() {
        new Service2().doServer2();
    }

    public static void main(String[] args) {
        new Service2().doServer2();
    }
}

class Test1 {
    public static void main(String[] args) {
        new Service1().doServer1();
    }
}

class Test {

    @SuppressWarnings({"rawtypes", "unchecked"})
    public static void main(String[] args) throws Exception {

        //从spring.txt中获取类名称和方法名称
        File springConfigFile = new File("D:\\test\\spring.txt");
        Properties springConfig = new Properties();
        springConfig.load(new FileInputStream(springConfigFile));
        String className = (String) springConfig.get("class");
        String methodName = (String) springConfig.get("method");

        System.out.println("顺序执行成功！");


        //根据类名称获取类对象
        Class clazz = Class.forName(className);
        //根据方法名称，获取方法对象
        Method m = clazz.getMethod(methodName);
        //获取构造器
        Constructor c = clazz.getConstructor();
        //根据构造器，实例化出对象
        Object service = c.newInstance();
        //调用对象的指定方法
        m.invoke(service);

    }
}